package com.wzdigit.wms.hm.config;

import com.google.common.collect.ImmutableMap;
import com.wzdigit.framework.RestStatus;

/**
 * @author administrator
 */
public enum StatusCode implements RestStatus {

    OK("20000", "请求成功"),

    BUSINESS_ERR("30000", "业务异常"),
    
    /**
     * 请勿重复提交
     */
    REPEAT_SUBMIT("30001", "请勿重复提交"),

    /**
     * 40xxx 客户端不合法的请求
     */
    INVALID_MODEL_FIELDS("40001", "字段校验非法"),

    /**
     * 参数类型非法，常见于SpringMVC中String无法找到对应的enum而抛出的异常
     */
    INVALID_PARAMS_CONVERSION("40002", "参数类型非法"),

    /**
     * 参数必填
     */
    INVALID_PARAMS_MUST("40003", "参数必填"),

    // 41xxx 请求方式出错
    /**
     * http media type not supported
     */
    HTTP_MESSAGE_NOT_READABLE("41001", "HTTP消息不可读"),

    /**
     * 请求方式非法
     */
    REQUEST_METHOD_NOT_SUPPORTED("41002", "不支持的HTTP请求方法"),

    /**
     * 成功接收请求, 但是处理失败
     */
    DUPLICATE_KEY("42001", "操作过快, 请稍后再试"),

    /**
     * 用于登录时用户不存在的情况
     */
    USER_NOT_EXISTS("42002", "会话过期，请重新进入......"),

    // 50xxx 服务端异常
    /**
     * 用于处理未知的服务端错误
     */
    SERVER_UNKNOWN_ERROR("50001", "服务端异常, 请稍后再试"),

    /**
     * 用于远程调用时的系统出错
     */
    SERVER_IS_BUSY_NOW("50002", "系统繁忙, 请稍后再试"),

    /**
     * 系统更新异常
     */
    SERVER_MODIFY_ERROR("50003", "系统更新异常"),

    /**
     * 系统更新异常
     */
    SERVER_NOT_FOUND_ERROR("50004", "记录不存在"),

    /**
     * 系统新增异常
     */
    SERVER_REPETITION_ERROR("50005", "记录已存在"),

    /**
     * 文件操作异常（建议填写错误描述）
     */
    SERVER_FILE_ERROR("50006", "文件操作"),
    /**
     * JSON转换实体出错
     */
    JSON_SERIALIZE_ERROR("50007", "JSON转换实体出错！"),

    /**
     * 系统操作（建议填写错误描述）
     */
    SERVER_OPERATION("50009", "系统操作"),

    /**
     * 系统操作（建议填写错误描述）
     */
    SERVER_DELETE_ERROR("50010", "删除失败"),

    /**
     * 该编码的数据已存在
     */
    CODE_DATA_EXIST("50011", "该编码的数据已存在"),

    /**
     * 已存在相同的明细属性
     */
    DTL_DATA_EXIST("50012", "已存在相同的明细属性"),

    /**
     * 该属性的数据已存在
     */
    ATTR_DATA_EXIST("50013", "存在重复属性"),

    /**
     * 该模板数据为空
     */
    IMPORT_DATA_NULL("50014", "该模板数据为空"),
    
    /**
     * 当前登录用户没有信息
     */
    SERVER_USERNOT_ERROR("50015", "当前登录用户没有信息"),
    
    /**
     * 当前单据状态不为：‘新增’,不允许修改！
     */
    SERVER_ASNHEADERNOEDIT_ERROR("50016", "当前单据状态不为：‘新增’,不允许修改！"),
    
    /**
     * 当前单据状态不为：‘部分收货’,不允许关闭！
     */
    SERVER_ASNHEADERNOCLOSE_ERROR("50017", "当前单据状态不为：‘部分收货’,不允许关闭！"),
    
    /**
     * 当前用户未维护权限仓库！
     */
    SERVER_USERNOWH_ERROR("50018", "当前用户未维护权限仓库！"),

    /**
     * 当前SN存在状态不为“待上架”的数据！
     */
    HAS_OTHER_STATUS("50019", "当前SN存在状态不为“待上架/已下架”的数据！"),
    
    /**
     * 条码无效
     */
    NOT_GOOD_SN("50020", "条码无效"),
    
    /**
     * 库位不存在
     */
    NOT_EXIST_LOC("50021", "库位不存在或已停用"),
    
    /**
     * 该清单已接收
     */
    HAVE_RECEIVED("50022", "该清单已接收"),
    
    /**
     * 接收数量有误
     */
    CMP_QTY_ERROR("50023", "接收数量有误"),
    
    /**
     * 调拨单不是创建状态
     */
    TRANSFER_DTL_SUBMITED("50025", "当前转仓单已提交"),
	
	/**
     * 调拨单不存在
     */
    TRANSFER_DTL_NULL("50026", "调拨单不存在"),
    
    /**
     * 没有该单据所在仓库的权限，请联系管理员
     */
    TRANSFER_NULL_WHS1("50027", "没有该单据所在仓库的权限，请联系管理员"),
    
    /**
     * 没有该单据所在仓库的权限，请联系管理员
     */
    TRANSFER_NULL_WHS2("50028", "没有当前账号权限的仓库的转仓单数据，请联系管理员"),
    
    /**
     * 批次号不存在
     */
    LOTNO_NULL("50029", "批次号不存在"),
    
    /**
     * 货品的批次属性未设置
     */
    LOTATTR_NULL("50030", "批次属性未设置"),
    
    /**
     * 请分配足够库存！
     */
    NE_ORDER_QTY("50031", "分配数量不能小于需求数量！"),
    
    /**
     * 不允许取消！
     */
    NOTCAN_CANCEL("50032", "不允许取消！"),
    
    /**
     * 不允许分库！
     */
    NOTCAN_PREALOC("50033", "不允许分库"),
    
    /**
     * 不允许增加货柜！
     */
    NOTCAN_ADDCTNRLOADING("50034", "不允许增加货柜！"),
    
    /**
     * 不允许排柜！
     */
    NOTCAN_ROWCTNRLOADING("50035", "不允许排柜！"),
    
    /**
     * 请分配足够库存！
     */
    GT_ORDER_QTY("50036", "分配数量不能大于需求数量！"),
    
    /**
     * 请分配足够库存！
     */
    NE_AVAILABLEINVZONE("50037", "可用库存不足！"),
    
    /**
     * 不允许打印余留单pdf！
     */
    NOTCAN_LOADINGREMAINPRINT("50038", "不允许打印余留单pdf！"),
    
    /**
     * 不允许打印发货单pdf！
     */
    NOTCAN_LOADINGPRINTINVOICE("50039", "不允许打印发货单pdf！"),
    
    /**
     * 不允许拆单！
     */
    NOTCAN_SPLIT("50040", "不允许拆单！"),
    
    /**
     * 不允许关单，当前单据状态不是“进行中”！
     */
    ONLY_DEAL_DOING_TRANSFER("50041", "不允许关单，当前单据状态不是“进行中”！"),
    
    /**
     * 该批次属性已被使用，不可修改！
     */
    LOT_ATTR_USE("50042", "该批次属性已被使用，不可修改！"),
    
    /**
     * 物料不存在！
     */
    SKU_NO_HAVE("50043", "物料不存在！"),
    
    /**
     * 该车辆数据已存在
     */
    VEHICLE_DATA_EXIST("60001", "该车辆数据已存在！"),
    
    /**
     * 模板错误，请确认
     */
    IMPORT_DATA_ERROR("60002", "模板错误，请确认"),
    
    /**
     * sn信息不存在
     */
//    NOT_FOUND_SN("60003", "SN[%s]信息不存在!"),
    
    /**
     * SN父级包装不存在或包装路径不存在!
     */
    NOT_FOUND_SN_PARENT_URL("60004", "SN[{}]的父级包装不存在或父级包装路径不存在!"),

    /**
     * 调用SAP系统的报检接口异常
     */
    SAP_REPORT_CHECK_ERROR("60005", "调用SAP系统的报检接口异常"),
    
    /**
     * 上架，扫描SN时，请扫描同一仓库的SN
     */
    NOT_SAME_WHS_ERROR("60006", "请扫描同一仓库的SN");


    private final String code;

    private final String message;

    private String details = "";

    private static final ImmutableMap<Integer, StatusCode> CACHE;

    static {
        final ImmutableMap.Builder<Integer, StatusCode> builder = ImmutableMap.builder();
        for (StatusCode statusCode : values()) {
            builder.put(Integer.valueOf(statusCode.code()), statusCode);
        }
        CACHE = builder.build();
    }

    StatusCode(String code, String message) {
        this.code = code;
        this.message = message;
    }

    StatusCode(String code, String message, String details) {
        this.code = code;
        this.message = message;
        this.details = details;
    }

    public static StatusCode valueOfCode(int code) {
        final StatusCode status = CACHE.get(code);
        if (status == null) {
            throw new IllegalArgumentException("No matching constant for [" + code + "]");
        }
        return status;
    }

    @Override
    public String code() {
        return code;
    }

    @Override
    public String message() {
        return message;
    }

    @Override
    public String details() {
        return details;
    }

}
